package br.com.bancodecurriculos.controleacesso.negocio;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.List;

import br.com.bancodecurriculos.controleacesso.dao.IUsuarioDAO;
import br.com.bancodecurriculos.controleacesso.dao.impl.UsuarioDAO;
import br.com.bancodecurriculos.controleacesso.dominio.Perfil;
import br.com.bancodecurriculos.controleacesso.dominio.Usuario;
import br.com.bancodecurriculos.util.criptografia.CriptografiaMD5;
import br.com.bancodecurriculos.util.criptografia.ICriptografia;
import br.com.bancodecurriculos.util.exception.RegistroExistenteException;
import br.com.bancodecurriculos.util.exception.RegistroInexistenteException;

public class UsuarioServices {

	/* private static final String PERFIL_DEFAULT = "perfil.default"; */

	private static final String PERFIL_DEFAULT = "Candidato";

	private IUsuarioDAO usuarioDAO;
	private ICriptografia criptografia;

	private static UsuarioServices instance;

	private UsuarioServices() {
		this.usuarioDAO = new UsuarioDAO();
		this.criptografia = new CriptografiaMD5();
	}

	public static UsuarioServices getInstance() {
		if (instance == null) {
			instance = new UsuarioServices();
		}
		return instance;
	}

	public void inserirUsuario(Usuario usuario) throws ClassNotFoundException,
			SQLException, NoSuchAlgorithmException, RegistroExistenteException,
			IOException {
		Perfil perfil = this.getPerfilByName(PERFIL_DEFAULT);
		usuario.setPerfil(perfil);
		usuario = this.criptografarSenha(usuario);
		this.usuarioDAO.save(usuario);
	}

	public void atualizarUsuario(Usuario usuario)
			throws ClassNotFoundException, NoSuchAlgorithmException,
			SQLException, RegistroInexistenteException, IOException {
		usuario = this.criptografarSenha(usuario);
		this.usuarioDAO.update(usuario);
	}

	public Usuario getUsuarioById(long id) throws ClassNotFoundException,
			SQLException, IOException {
		return this.usuarioDAO.getById(id);
	}

	public void excluirUsuario(long id) throws ClassNotFoundException,
			SQLException, RegistroInexistenteException, IOException {
		this.usuarioDAO.delete(id);
	}

	public List<Perfil> getPerfis() throws ClassNotFoundException,
			SQLException, IOException {
		return this.usuarioDAO.getPerfilDAOHelper().getAll();
	}

	public Perfil getPerfilByName(String name) throws ClassNotFoundException,
			SQLException, IOException {
		return this.usuarioDAO.getPerfilDAOHelper().getByName(name);
	}

	private Usuario criptografarSenha(Usuario usuario)
			throws NoSuchAlgorithmException {
		String senha = usuario.getSenha();
		senha = this.criptografia.criptografar(senha);
		usuario.setSenha(senha);
		return usuario;
	}

	public boolean validarUsuario(Usuario usuario)
			throws ClassNotFoundException, SQLException,
			NoSuchAlgorithmException, IOException {
		usuario = this.criptografarSenha(usuario);
		Usuario resultado = this.usuarioDAO.getByLoginSenha(usuario.getLogin(),
				usuario.getSenha());
		if (resultado != null
				&& resultado.getPerfil().equals(usuario.getPerfil())) {
			return true;
		}
		return false;
	}

}
